//
//  Problem1513.swift
//  TestProject
//
//  Created by 毕武侠 on 2021/3/31.
//  Copyright © 2021 zhulong. All rights reserved.
//

import UIKit

/*
 1513. 仅含 1 的子串数
 给你一个二进制字符串 s（仅由 '0' 和 '1' 组成的字符串）。
 返回所有字符都为 1 的子字符串的数目。
 由于答案可能很大，请你将它对 10^9 + 7 取模后返回。

 示例 1：
     输入：s = "0110111"
     输出：9
     解释：共有 9 个子字符串仅由 '1' 组成
     "1" -> 5 次
     "11" -> 3 次
     "111" -> 1 次
 示例 2：
     输入：s = "101"
     输出：2
     解释：子字符串 "1" 在 s 中共出现 2 次
 示例 3：
     输入：s = "111111"
     输出：21
     解释：每个子字符串都仅由 '1' 组成
 示例 4：
     输入：s = "000"
     输出：0
 提示：
     s[i] == '0' 或 s[i] == '1'
     1 <= s.length <= 10^5
 */
@objcMembers class Problem1513: NSObject {
    func solution() {
        print(numSub("0110000011111111001011100111"))
    }
    
    /*
     1: 遍历字符串，寻找所有长度为1的字串
     2: 例如：
     1      => 1        1
     11     => 3        2 + 1
     111    => 6        3 + 2 + 1
     1111   => 10       4 + 3 + 2 + 1
     11111  => 15       5 + 4 + 3 + 2 + 1       => n * (n + 1) / 2
     
     */
    func numSub(_ s: String) -> Int {
        var result = 0
        var n = 0
        for c in s {
            if c == "0" {
                if n != 0 {
                    result += (n * (n + 1) / 2)
                    result %=  1000000007
                }
                n = 0
            } else {
                n += 1
            }
        }
        result += (n * (n + 1) / 2)
        result %=  1000000007
        return result
    }
}
